package com.bjpowernode.filter;

import com.bjpowernode.beans.User;
import com.bjpowernode.services.UserServices;
import com.bjpowernode.tools.MyTools;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.*;
import java.io.IOException;


//过滤器继承HttpFilter，重写doFilter完成过滤任务
//Tomcat在启动的时候会启动过滤器，且仅有一个对象
//过滤器如果需要初始化，则需要重写HttpFilter的父类GenericFilter的init方法，完成初始化任务，启动时机依然是Tomcat启动的时候，但在构造方法之后启动
//为何不用构造方法来初始化？
//1——因为初始化方法提供一个FilterConfig对象，可以调用一些参数


//HttpServlet与过滤器一样
//在第一次使用HttpServlet的时候实例化，且仅有一个对象
//HttpServlet如果需要初始化，则需要重写HttpServlet的父类GenericServlet的init方法，完成初始化任务，启动时机依然是Tomcat启动的时候，但在构造方法之后启动
//为何不用构造方法来初始化？
//1——因为初始化方法提供一个ServletConfig对象，可以调用一些参数

//Tomcat上下文ServletContext
//ServletContext其实就是web.xml文件的对象
//1——可以在web.xml里面设置全局KV
//<context-param>
//<param-name>spring</param-name>
//<param-value>application.xml</param-value>
//</context-param>





//过滤器和拦截器同时生效，则拦截器失效
//过滤器优先于拦截器
//过滤器过滤静态页面
//拦截器拦截action
@WebFilter(urlPatterns = {"/admin/*"})
public class LoginFilter extends HttpFilter {
    UserServices userServices;
    ApplicationContext context;
    //这里需要根据情况判定cookie
    @Override
    protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {

        String requestURI = req.getRequestURI();
        System.out.println("1-1——过滤器准备拦截：" + requestURI);
        //判断后缀
        if (requestURI.indexOf(".html") == -1) {
            System.out.println("1-2——不属于过滤器拦截范围：" + requestURI);
            //放行
            chain.doFilter(req, res);
            return;
        }

        System.out.println("1-3——属于过滤器拦截范围：" + requestURI);
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");
        if (user == null) {
            System.out.println("2-1——过滤器拦截：" + requestURI);
            userServices = context.getBean(UserServices.class);

            try {
                MyTools.loginCookies(req,userServices,()->{
                    //重定向到登录界面
                    res.sendRedirect("/login.html");
                });
            } catch (Exception e) {
                throw new RuntimeException(e);
            }


        }

        //放行
        chain.doFilter(req, res);
        System.out.println("3——过滤器响应：" + requestURI);

    }


    //过滤器初始化
    @Override
    public void init(FilterConfig config) throws ServletException {
        //Tomcat上下文
        ServletContext servletContext = config.getServletContext();
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
        System.out.println("LoginFilter过滤器初始化.....................");
        context = new ClassPathXmlApplicationContext(contextConfigLocation);
    }


}
